package ar.edu.unq.edp.futbol.mains;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

import org.hibernate.Session;

import persistencia.EquipoBuilder;
import persistencia.Fecha;
import persistencia.TecnicoBuilder;
import unq.equipos.dom.Equipo;
import unq.equipos.dom.partidos.PartidoCopa;
import unq.equipos.dom.partidos.PartidoSimple;

public class MassivePartidoCreator {
	
	private String equipo2;
	private String equipo1;
	private String equipo3;
	private String equipo4;

	public MassivePartidoCreator(String equipo1, String equipo2, String equipo3, String equipo4) {
		this.equipo1 = equipo1;
		this.equipo2 = equipo2;
		this.equipo3 = equipo3;
		this.equipo4 = equipo4;
		
	}
	
	/**
	 * Crea 1560 fechas
	 */
	public Set<Fecha> generatorDates(){
		Set<Fecha> retorno = new HashSet<Fecha>(); 
		for(int anio = 2011 ; anio <=2020 ; anio++){
			for (int mes = 1 ; mes<=12 ; mes++){
				for(int dia = 1 ; dia <=28 ; dia += 2){
					retorno.add(new Fecha(dia, mes, anio));
				}
			}
		}
		return retorno;
	}	
	
	/**
	 * Crea 4 equipos, 2 grandes y 2 normales
	 */
	public Set<Equipo> createEquipos(){
		Set<Equipo> equipos = new HashSet<Equipo>();
		TecnicoBuilder tecnicoBuilder = new TecnicoBuilder();
		EquipoBuilder teamBuilder = new EquipoBuilder();
		equipos.add(teamBuilder.mkBigTeam(equipo1, tecnicoBuilder.premadeTecnico1()));
		equipos.add(teamBuilder.mkBigTeam(equipo2, tecnicoBuilder.premadeTecnico2()));
		equipos.add(teamBuilder.mkNormalTeam(equipo3,tecnicoBuilder.premadeTecnico3()));
		equipos.add(teamBuilder.mkNormalTeam(equipo4, tecnicoBuilder.premadeTecnico4()));
		return equipos;
	}
	
	/**
	 * Crea 3120 partidos simples, intercalando visitante y local
	 */
	public List<PartidoSimple> createPartidosSimples(){
		List<PartidoSimple> partidos = new ArrayList<PartidoSimple>();
		List<Fecha> fechas = new ArrayList<Fecha>(generatorDates());
		List<Equipo> equipos = new ArrayList<Equipo>(createEquipos());
		Equipo equipo1, equipo2;
		PartidoSimple current;
		for (int index = 0; index <= 2; index += 2){
			equipo1 = equipos.get(index);
			equipo2 = equipos.get(index+1);
			for (Fecha fecha : fechas){
				current = makePartidoSimple(equipo1,equipo2,fecha);
				partidos.add(current);
				switchEquipos(equipo1, equipo2);
			}
		}
		return partidos;
	}

	private PartidoSimple makePartidoSimple(Equipo equipo1, Equipo equipo2, Fecha fecha) {
		PartidoSimple current = new PartidoSimple(equipo1, equipo1.armarFormacion(), equipo2, equipo2.armarFormacion());
		current.setFecha(fecha);
		current.setGolesEquipoLocal(new Random().nextInt(3));
		current.setGolesEquipoVisitante(new Random().nextInt(3));
		return current;
	}

	/**
	 * switchea equipos, este proceso es destructivo
	 */
	private void switchEquipos(Equipo local, Equipo visitante){
		Equipo temp = local;
		local = visitante;
		visitante = temp;
	}
	
	/**
	 *  Crea 1560 Partidos de Copa
	 */
	public List<PartidoCopa> createPartidosCopa(){
		List<PartidoSimple> partidosSimple = createPartidosSimples();
		List<PartidoCopa> partidosCup = new ArrayList<PartidoCopa>();
		for (int index =0 ; index < partidosSimple.size(); index += 2) {
			PartidoCopa current = makePartidoCopa(partidosSimple.get(index),partidosSimple.get(index+1));
			partidosCup.add(current);
		}
		return partidosCup;		
	}

	private PartidoCopa makePartidoCopa(PartidoSimple partidoUno, PartidoSimple partidoDos) {
		PartidoCopa retorno = new PartidoCopa();
		retorno.setPartidoUno(partidoUno);
		retorno.setPartidoDos(partidoDos);
		int golesEquipoUno = partidoUno.getGolesEquipoLocal() + partidoDos.getGolesEquipoVisitante();
		int golesEquipoDos = partidoDos.getGolesEquipoLocal() + partidoUno.getGolesEquipoVisitante();
		boolean b = golesEquipoUno==golesEquipoDos;
		if (golesEquipoDos == golesEquipoUno){
			int golesPenal1 = new Random().nextInt(6);
			int golesPenal2 = new Random().nextInt(6);
			while (golesPenal1 == golesPenal2){
				golesPenal2 = new Random().nextInt(6);
			}
			retorno.setGolesPenalEquipoUno(golesPenal1);
			retorno.setGolesPenalEquipoDos(golesPenal2);
		}
		return retorno;
	}
}